/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.yonsei.iwb.smarttv.result;

import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.vocabulary.RDFS;

/**
 * 온톨로지 검색 결과 및 개체 식별 결과를 를 저장하기 위한 최소 단위 클래스로써 해당되는 개체에 대한 URI와 Label로 구성된 클래스
 *
 * @author Onlyjiny
 */
public class ResultNode {

    /**
     * 결과 노드의 URI
     */
    private Resource node;
    /**
     * 결과 노드의 대표 Label
     */
    private String label;

    /**
     * 결과 노드를 생성하기 위한 기본 생성자
     */
    public ResultNode() {
        node = ResourceFactory.createResource();
        label = new String();
    }

    /**
     * 결과 Resource를 이용하여 결과 노드를 생성하기 위한 생성자
     *
     * @param resource 결과에 대해 Jena의 Resource 객체가 전달될 경우 이의 URI와 Label을 찾아 결과 노드를 생성
     */
    public ResultNode(Resource resource) {
        this.node = resource;
        try {
            this.label = (String) resource.getProperty(RDFS.label).getObject().asLiteral().getValue();
        } catch (Exception e) {
            this.label = "";
        }
    }

    /**
     * URI와 Label을 이용하여 결과 노드를 생성하기 위한 생성자
     *
     * @param id 결과 노드의 URI
     * @param label 결과 노드의 Label
     */
    public ResultNode(String id, String label) {
        this.node = ResourceFactory.createResource(id);
        this.label = label;
    }

    /**
     * 결과 노드의 URI를 반환하는 메소드
     *
     * @return 결과 노드의 URI
     */
    public Resource getResultNode() {
        return this.node;
    }

    public String getResultNodeId() {
        return this.node.getURI();
    }

    /**
     * 결과 노드의 Label를 반환하는 메소드
     *
     * @return 결과 노드의 Label
     */
    public String getLabel() {
        return this.label;
    }

    public boolean equals(Resource r) {
        return this.getResultNode().equals(r);
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        if (this.label != null) {
            sb.append("Node URI: " + this.getResultNodeId() + ", Node Label: " + this.getLabel() + "\n");
        } else {
            sb.append("Node URI: " + this.getResultNodeId() + "\n");
        }
        return sb.toString();
    }
}
